package com.ktjy.service.impl;

import com.ktjy.service.UploadService;
import jakarta.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

/**
 * @version v1.0
 * @Author JieGe
 * @Create 2024-12-24 - 9:45
 */
@Service("toLocalUploadService") // 创建ToLocalUploadServiceImpl类的对象。 new ToLocalUploadServiceImpl();
public class ToLocalUploadServiceImpl implements UploadService {

    private static final Logger LOGGER = LoggerFactory.getLogger(ToLocalUploadServiceImpl.class);
    // 注入request对象
    @Autowired
    private HttpServletRequest request;

    // 定义上传文件保存目录的常量
    private static final String UPLOAD_PATH = "/statics/upload/";

    /**
     * 用于文件(图片)上传
     * @param uploadFile 文件/图片对象
     * @param allowFileExtends 允许的文件扩展名/后缀。 "jpg","png"等
     * @return 返回文件上传成功后的文件路径
     */
    @Override
    public String uploadFile(MultipartFile uploadFile, String... allowFileExtends) throws Exception {
        // Arrays.asList是将数组转换成List集合。 转换成HashSet
        Set<String> include = new HashSet(Arrays.asList(allowFileExtends));
        // 获取保存路径
        // E:\\bdqn\\03-KTSP\\03-S3\\02-SSM\\02-code\\T372\\mavenproject\\ch06_ktsms\\target\ch06_ktsms\\statics\\upload
        String rootPath = request.getServletContext().getRealPath(UPLOAD_PATH);
        // 如果文件非空
        if (!uploadFile.isEmpty()) {
            // 1、先获取文件的原始名
            String fileName = uploadFile.getOriginalFilename();
            // 2、获取原始文件的扩展名
            String extension = StringUtils.getFilenameExtension(fileName);
            // 3、判断这个扩展名是否符合要求
            if (!include.contains(extension)) { // contains判断是否包含  你上传的是.swf
                throw new Exception("上传文件仅支持" + include + "扩展名");
            }
            // 4、自动一个唯一的文件名
            String uploadFileName = UUID.randomUUID() + "." + extension;
            // 5、创建File文件对象
            File file = new File(rootPath, uploadFileName);
            // 6、判断父目录是否存在， rootPath就为父目录
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();  // 如果父目录不存在，就创建这个父目录
            }
            try {
                // 最后将文件上传到这个父目录中
                uploadFile.transferTo(file);
                // 上传成功后，还需要返回上传成功的文件路径
                // E:\\bdqn\\03-KTSP\\03-S3\\02-SSM\\02-code\\T372\\mavenproject\\ch06_ktsms\\target\ch06_ktsms\\statics\\upload\\6456464566.jpg
                return UPLOAD_PATH + uploadFileName;
            } catch (IOException e) {
                LOGGER.error("执行uploadFile()文件进行文件上传出错，", e);
                throw new RuntimeException(e);
            }
        }
        return null;
    }
}
